/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package atribGerais;

/**
 *
 * @author Casa
 */
public class AtributosGerais {

    //contadores pontuais
    private int pontosTotais;
    private int pontosGastos;
    //componentes
    private Habilidades listaHabilidades = new Habilidades();
    private Pericias listaPericias = new Pericias();
    private VantagensDesvantagens listaVantagensDesvantagens = new VantagensDesvantagens();
    private Conhecimentos listaConhecimentos = new Conhecimentos();
    //atributos
    private int forca;
    private int destreza;
    private int vigor;
    private int sabedoria;
    private int raciocinio;
    private int concentracao;
    private int vontade;
    private int carisma;
    private int manipulacao;
    private int conviccao;
    //atributos extras
    private int velocidade;
    private int resistencia;
    private int reflexo;
    private int percepcao;
    //pontos extras
    private int velocidadeExtra;
    private int pvExtra;
    private int pmExtra;
    private int pfExtra;

    public AtributosGerais() {
    }

    public int getCarisma() {
        return carisma;
    }

    public int getVelocidade() {
        return velocidade;
    }

    public void setCarisma(int carisma) {
        pontosGastos += calculaDiferenca(this.carisma, carisma);
        this.carisma = carisma;
    }

    public int getConcentracao() {
        return concentracao;
    }

    public void setConcentracao(int concentracao) {
        pontosGastos += calculaDiferenca(this.concentracao, concentracao);
        this.concentracao = concentracao;
    }

    public int getConviccao() {
        return conviccao;
    }

    public void setConviccao(int conviccao) {
        pontosGastos += calculaDiferenca(this.conviccao, conviccao);
        this.conviccao = conviccao;
    }

    public int getDestreza() {
        return destreza;
    }

    public void setDestreza(int destreza) {
        pontosGastos += calculaDiferenca(this.destreza, destreza);
        this.destreza = destreza;
    }

    public int getForca() {
        return forca;
    }

    public void setForca(int forca) {
        pontosGastos += calculaDiferenca(this.forca, forca);
        this.forca = forca;
    }

    public int getManipulacao() {
        return manipulacao;
    }

    public void setManipulacao(int manipulacao) {
        pontosGastos += calculaDiferenca(this.manipulacao, manipulacao);
        this.manipulacao = manipulacao;
    }

    public int getPfExtra() {
        return pfExtra;
    }

    public void setPfExtra(int pfExtra) {
        pontosGastos += calculaPontoExtra(pfExtra, false) - calculaPontoExtra(this.pfExtra, false);
        this.pfExtra = pfExtra;
    }

    public int getPmExtra() {
        return pmExtra;
    }

    public void setPmExtra(int pmExtra) {
        pontosGastos += calculaPontoExtra(pmExtra, false) - calculaPontoExtra(this.pmExtra, false);
        this.pmExtra = pmExtra;
    }

    public int getPvExtra() {
        return pvExtra;
    }

    public void setPvExtra(int pvExtra) {
        pontosGastos += calculaPontoExtra(pvExtra, true) - calculaPontoExtra(this.pvExtra, true);
        this.pvExtra = pvExtra;
    }

    public int getRaciocinio() {
        return raciocinio;
    }

    public void setRaciocinio(int raciocinio) {
        pontosGastos += calculaDiferenca(this.raciocinio, raciocinio);
        this.raciocinio = raciocinio;
    }

    public int getSabedoria() {
        return sabedoria;
    }

    public void setSabedoria(int sabedoria) {
        pontosGastos += calculaDiferenca(this.sabedoria, sabedoria);
        this.sabedoria = sabedoria;
    }

    public int getVigor() {
        return vigor;
    }

    public void setVigor(int vigor) {
        pontosGastos += calculaDiferenca(this.vigor, vigor);
        this.vigor = vigor;
    }

    public int getVontade() {
        return vontade;
    }

    public void setVontade(int vontade) {
        pontosGastos += calculaDiferenca(this.vontade, vontade);
        this.vontade = vontade;
    }

    public int getPercepcao() {
        return percepcao;
    }

    public int getReflexo() {
        return reflexo;
    }

    public int getResistencia() {
        return resistencia;
    }

    public int getVelocidadeExtra() {
        return velocidadeExtra;
    }

    public void setVelocidadeExtra(int velocidadeExtra) {
        if (velocidadeExtra < destreza / 2) {
            pontosGastos += calculaDiferenca(this.velocidadeExtra, velocidadeExtra);
            this.velocidadeExtra = velocidadeExtra;
        }
    }

    public void updatePontos() {
        // este método deverá ser executado após cada alteração
        // ele fará o calculo total de todos os pontos
        updateAtributosExtras();
        pontosGastos =
                listaConhecimentos.getPontos() +
                listaHabilidades.getPontos() +
                listaPericias.getPontos() +
                listaVantagensDesvantagens.getPontos() +
                (int) ((forca - 1) * forca * 0.5) +
                (int) ((vigor - 1) * vigor * 0.5) +
                (int) ((destreza - 1) * destreza * 0.5) +
                (int) ((sabedoria - 1) * sabedoria * 0.5) +
                (int) ((raciocinio - 1) * raciocinio * 0.5) +
                (int) ((concentracao - 1) * concentracao * 0.5) +
                (int) ((vontade - 1) * vontade * 0.5) +
                (int) ((carisma - 1) * carisma * 0.5) +
                (int) ((manipulacao - 1) * manipulacao * 0.5)+
                (int) ((conviccao - 1) * conviccao * 0.5)+
                calculaPontoExtra(pvExtra, true)+
                calculaPontoExtra(pmExtra, false)+
                calculaPontoExtra(pfExtra, false)+
                (int) ((velocidadeExtra - 1) * velocidadeExtra * 0.5);




    }

    public int getPontosRestantes(){
        return pontosTotais - pontosGastos;
    }

    public Conhecimentos getListaConhecimentos() {
        return listaConhecimentos;
    }

    public Habilidades getListaHabilidades() {
        return listaHabilidades;
    }

    public Pericias getListaPericias() {
        return listaPericias;
    }

    public VantagensDesvantagens getListaVantagensDesvantagens() {
        return listaVantagensDesvantagens;
    }

    public int getPontosGastos() {
        return pontosGastos;
    }

    public int getPontosTotais() {
        return pontosTotais;
    }

    public void setListaConhecimentos(Conhecimentos listaConhecimentos) {
        this.listaConhecimentos = listaConhecimentos;
    }

    public void setListaHabilidades(Habilidades listaHabilidades) {
        this.listaHabilidades = listaHabilidades;
    }

    public void setListaPericias(Pericias listaPericias) {
        this.listaPericias = listaPericias;
    }

    public void setListaVantagensDesvantagens(VantagensDesvantagens listaVantagensDesvantagens) {
        this.listaVantagensDesvantagens = listaVantagensDesvantagens;
    }

    public void setPontosTotais(int pontosTotais) {
        this.pontosTotais = pontosTotais;
    }

    private int calculaDiferenca(int X, int Y) {
        //este método calculará a diferença de pontos entre um atributo
        //de X pontos e um atributo de Y pontos
        return (int) ((Y - 1) * Y * 0.5 - (X - 1) * X * 0.5);
    }

    private int calculaPontoExtra(int X, boolean pv) {
        // este método retorna a quantidade de pontos referentes a X
        // pontos de pv, pf ou pm; o cálculo para pf e pm são iguais,
        // mas o de pv é diferenciado, por isto, ele verifica se o calculo
        // é para pv ou para algum dos outros dois
        if (pv) {
            if (X / 50 == 0) {
                return X % 50;
            } else {
                return X % 50 + 50 * (1 - (int) (Math.pow(2, (X / 50) + 1))) / (1 - 2);
            }
        } else {
            if (X / 100 == 0) {
                return X % 100;
            } else {
                return X % 100 + 100 * (1 - (int) (Math.pow(2, (X / 100) + 1))) / (1 - 2);
            }
        }
    }

    private void updateAtributosExtras() {
        velocidade = velocidadeExtra + destreza;
        resistencia = (vigor + vontade) / 2;
        reflexo = Math.min(raciocinio, destreza);
        percepcao = Math.min(raciocinio, concentracao);
    }
}
